public class Test {

    public static void main1(String[] args) {
        Student1 s1 = new Student1("lisi",19);
//        Student1 s2 = new Student1("zhangsan",19);
//        Student1 s3 = new Student1("wangwu",19);
//        System.out.println("hhhhhhh");
//        System.out.println(s1.classRoom);
//        System.out.println(Student1.classRoom);
//        Student1 s4 =null;
//        System.out.println(s4.classRoom);
        //classRoom不属于对象，不依赖于对象，只需要类就加载
//        System.out.println(s4.name);


//        s1.func();
        Student1.func();
//        Student1 s10 = new Student1("lisi",19,10);


        {
            System.out.println("普通代码块");
            System.out.println("____________--");

        }

    }

    public static void main2(String[] args) {
//        Student1 s = new Student1("lisi",19);
        Student1 s = new Student1();
        System.out.println(s.getName());
    }

    public static void main(String[] args) {
        Student1.func();
    }
}



//每个学生对象都会有三个属性，name age classRoom 但是classRoom
//对所有学生来说都一致，所以没有必要每个对象一份，只需要一份，所有对象共享1

//成员变量  静态成员变量 非静态成员变量
//被static修饰的成员变量，也称为类成员
//，类变量，不属于某个具体对象，为所有对象共享的，放在方法区内

//类变量通过类名访问，也可以通过引用变量1去访问，但是一般使用类访问
//静态的成员变量不属于对象，所以不需要通过对象访问，直接可以通过类名进行访问


//类变量的特性
//不属于某个具体对象，是类的属性，为所有对象共享，不存储在堆上，存储在方法区上
//既可以通过对象访问，也可以通过类名访问
//生命周期和类相同（随类的加载而创建，类的卸载而销毁）

//static修饰成员方法  静态成员方法（类方法）  非静态成员方法
//不属于对象，直接通过类名调用，不依赖于对象，为所有对象共享

//静态方法内部不能直接调用非静态成员方法
//静态方法之间可以相互调用

//只要是非静态成员1或者方法，必须通过对象访问，不能直接通过类名来访问
//非静态方法可以直接调用静态方法，静态变量
//静态方法里面是不能使用this的


//建议：获取静态或设置静态的成员变量，此时的方法最好是静态的
//否则，要是非静态的方法，还得实例化对象，再通过对象去获取或者设置静态变量1


//静态成员变量的初始化
//就地初始化：直接赋值
//默认初始化
//可以通过提供set和get方法进行初始化（123使用最频繁）
//静态成员变量在构造对象的时候，可以在构造方法里面赋值
//通过代码块进行赋值


////代码块
//普通代码块：在方法里面用花括号括起来的代码块1
//构造快（非静态代码块/实例块）
//静态代码块：初始化静态成员变量，也可以提前准备数据.只要类被加载就会执行静态代码块
//非静态代码块只执行一次，就算多次调用对象或者静态方法，也只执行一次
//如果一个类中包含多个静态代码块，则按定义顺序执行
//静态代码块被合并到非静态代码块，非静态代码块被合并到构造方法

//非静态代码块和非静态字段的执行顺序：两者都是非静态的，则看这两者的定义的顺序
//执行顺序就按定义的先后顺序，但是实例代码块一定先于构造方法执行

//静态代码块---》非静态代码块---》构造方法

//可以简单认为，编译器  编译好代码后，会把非静态代码块1的东西，放到构造方法花括号里面的的最前面
class Student1 {
    private String name = "wusuowei";//名字是曹操
    private int age;
    public static String classRoom;
    private static int size;

    {
        System.out.println("非静态代码块/实例代码块/构造代码块");
        //一般用来初始化非静态成员变量
        this.name = "caocao";
    }

    static {
        System.out.println("静态代码块");
    }
//    private String name = "wusuowei";
//    名字是无所谓，因为无所谓在后面
    public Student1(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Student1() {

    }

    //静态成员变量在构造对象的时候，可以在构造方法里面赋值
//此处不推荐这种写法，因为静态变量从属于类，为所有对象共享，一旦被某个对象修改，其他对象访
// 问时访问到的是修改后的值，从属于类的变量不应该将控制权交给一个对象
    public Student1(String name, int age,int si) {
        this.name = name;
        this.age = age;
        size = si;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void doClass() {
        System.out.println("class");
    }

    public static void func() {
        System.out.println("static func");
        Student1 s = new Student1("lisi",10);
        s.func1();
        System.out.println(s.name);
        //        name = "lisi";

        //               func1();
    }

    public void func1() {
        System.out.println("no static");
    }
}


